package com.example.javamaday.reentrantlock;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * ReentrantLock学习（三）
 * <p>
 * 使用ReentrantLock可以替代synchronized.同时ReentrantLock又比synchronized灵活。
 * 因为
 * 1.可以使用tryLock进行尝试锁定，当无法锁定的时候或者在指定时间内无法锁定的时候，线程可以决定是否继续等待。
 * 2.可以使用lockInterruptibly对等待线程的锁进行打断。
 * 这里 lock 与 lockInterruptibly比较区别在于：
 * lock 优先考虑获取锁，待获取锁成功后，才响应中断。
 * lockInterruptibly 优先考虑响应中断，而不是响应锁的普通获取或重入获取。
 *
 * 详细区别：
 * ReentrantLock.lockInterruptibly允许在等待时由其它线程调用等待线程的Thread.interrupt方法来中断等待线程
 * 的等待而直接返回，这时不用获取锁，而会抛出一个InterruptedException。 ReentrantLock.lock方法不允许
 * Thread.interrupt中断,即使检测到Thread.isInterrupted,一样会继续尝试获取锁，失败则继续休眠。
 * 只是在最后获取锁成功后再把当前线程置为interrupted状态,然后再中断线程。
 *
 */
public class ReentrantLock3 {

    public static void main(String[] args) throws InterruptedException {
        Lock lock = new ReentrantLock();
        lock.lock();
        Thread.sleep(1000);
        Thread t1=new Thread(new Runnable(){
            @Override
            public void run() {
                //lock.lock();
	        	try {
					lock.lockInterruptibly();
				} catch (InterruptedException e) {
					e.printStackTrace();
                    System.out.println(Thread.currentThread().getName()+" interrupted.");
				}
                //lock.unlock();
            }
        });
        t1.start();
        Thread.sleep(1000);
        t1.interrupt();
        Thread.sleep(10000);
        lock.unlock();
    }

}
